今日會詳細講解Service和Deployment的功能
在[Day22]有使用port-forward的方式,讓local端的機器可以在browser上瀏覽想要的pod上,但這樣只有自己才可以看到,當正式環境要上線時,就需要有一個通道可以access到pod做溝通,所以在[Day24]使用Service這個抽象層,透過EC2的DNS Name訪問對應的pod,而node、service和pod的對應關係,請看下面這張圖:
從圖上很清楚地可以看到元件彼此的關係。此篇的Service Type,以NodePort為主,接下來說明YAML
apiVersion: v1
kind: Service
metadata:
name: web-service
labels:
app: web-demo
spec:
selector:
name: web-demo
type: NodePort
ports:
- protocol: TCP
port: 8080
targetPort: 80
nodePort: 30001
selector: 會去尋找Pod的label為web-demo去做連結,產生一個Endpoint才可以去access
nodePort: 在Node(EC2)上開啟一個Port,讓Internet的User可以透過這個Port access到後面的應用程式
Port: 將nodePort和targetPort做mapping,進行串流
targetPort: 開啟Pod上的Port,讓其他服務可以訪問
若應用程式是不容許中斷服務,那就會需要有HA的方式去維護。在Kubernetes有Controller Object這個概念,而Deployment就是其中一種,透過Deployment去控制多個Pod,甚至是當Pod壞掉,會自動新增Pod來滿足YAML裡replicas數量。
當Container或應用程式要做更新時,不需要把現有的Pod砍掉,在Deployment會先啟動新的Pod才把舊Pod砍掉,執行RollingUpdate/RollingBack
在Deployment底下的Pod也可以做橫向擴展,產生更多的Pod去運作應用程式
Deployment YAML描述
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-deploy
spec:
replicas: 2
selector:
matchLabels:
name: itdemo
template:
metadata:
labels:
name: itdemo
spec:
containers:
- name: itdemo
image: johnson860312/awswebdb
resources:
limits:
memory: "256Mi"
cpu: "128m"
ports:
- containerPort: 80
replicas: 決定Pod的數量。若有Pod掛掉,也會啟動新的Pod等於設定的數量
template: 創建的Pod都會依照模板去設定
matchLabels: 符合{“key”:”value”}這個組合去建立Pod
刪除Pod,然後EKS會自動啟動新的Pod
筆者使用Windows所以執行kubectl edit有些問題,所以這邊就使用Lens這套工具
執行還原,恢復原本的Container
此篇就介紹到這邊,明天會講Ingress的部分